#ifndef __BLOG_H__
#define __BLOG_H__
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>

    /**
     * @brief 配置结构体
     *
     */
    typedef struct
    {
        void (*f_lock)(void);                    /**< @brief 文件(存储)加锁 */
        void (*f_unlock)(void);                  /**< @brief 文件(存储)解锁 */
        void (*q_lock)(void);                    /**< @brief 队列加锁 */
        void (*q_unlock)(void);                  /**< @brief 队列加锁 */
        int (*write)(void *data, uint32_t size); /**< @brief 存储写入函数 */
        int (*read)(void *data, uint32_t size);  /**< brief 存储读取函数 @todo 可以不需要这个函数 */
    } blog_cfg_t;

    /**
     * @brief
     *
     * @param cfg
     * @return int
     */
    int blog_init(blog_cfg_t *cfg);

    /**
     * @brief 将日志数据格式化到内存中
     *
     * @param id 日志ID
     * @param data_in 日志数据输入
     * @param data_out 格式化后的数据输出
     * @param datain_size 输入数据大小
     * @param dataout_size 输出数据大小
     * @retval >0 格式化后数据大小
     * @retval <=0 格式化数据失败
     */
    int blog_log_format(uint16_t id, void *data_in, void *data_out, uint16_t datain_size, uint16_t dataout_size);

    /**
     * @brief 添加一个话题数据结构描述
     *
     * @param topic_desc
     * @return >=128 话题的id号
     * @return 0<=id<128 内置的id号，不应该出现
     * @return <0 添加失败
     */
    int blog_add_topic(const char *topic_desc);

    /**
     * @brief 添加一个话题数据结构描述,并指定话题ID号
     *
     * @param id 话题ID号， >= 128
     * @param topic_desc 话题的字符串描述
     * @return int  <= 0 添加失败
     * @return int  == 0
     */
    int blog_add_topic_fix_id(uint16_t id, const char *topic_desc);

    /**
     * @brief 添加一条数据日志(直接写入到存储中)
     *
     * @param id 日志的ID
     * @param data 日志数据，一般是一个结构体的数据
     * @param data_size 日志数据大小
     * @return 0 添加成功
     * @return <0 添加失败
     */
    int blog_write_log(uint16_t id, void *data, uint16_t data_size);

    /**
     * @brief 添加一条数据日志(写入到队列中)
     *
     * @param id 日志的ID
     * @param data 日志数据，一般是一个结构体的数据
     * @param data_size 日志数据大小
     * @return 0 添加成功
     * @return <0 添加失败
     */
    int blog_enqueue_log(uint16_t id, void *data, uint16_t data_size);

    /**
     * @brief 从日志缓冲队列中取出一条日志
     *
     * @param id 存储日志id的缓存指针
     * @param data 存储日志数据的缓存指针
     * @param data_size 数据日志大小
     * @param buff_size 提供用于缓存日志数据缓存的大小(字节)
     * @retval 0 成功
     * @retval <0 失败
     *
     */
    int blog_dequeue_log(uint16_t *id, void *data, uint16_t *data_size, uint16_t buff_size);

#ifdef __cplusplus
}
#endif
#endif
